/**
 * Copyright (c) [2025] [何屹林]
 *
 * 保留所有权利。
 *
 * 文件名称：utils.h
 * 模块功能说明：
 * 该模块作为基本类型定义、基本内容引入、基本模块实现，构建了基础的定义，包含了各类杂项
 *
 * 华南师范大学-计算机学院-网络工程-1班
 * 作者：何屹林-20222132023
 * 完成日期：2025年7月24日
 */
#include "utils.h"

size_t qHash(const Item& key)
{
    return qHash(key.name) + qHash(key.rule) + qHash(key.next) + qHash(key.pos);
}


QString trim(QString str)
{
    if(str.isEmpty()||str=="\\n")
    {return str;}
    // 去除开头的 '\'
    int firstNonSlash = 0;
    while (firstNonSlash < str.size() && str[firstNonSlash] == '\\') {
        firstNonSlash++;
    }
    str.remove(0, firstNonSlash); // 删除前导反斜杠

    // 去除结尾的 '\'
    int lastNonSlash = str.size() - 1;
    while (lastNonSlash >= 0 && str[lastNonSlash] == '\\') {
        lastNonSlash--;
    }
    str.chop(str.size() - lastNonSlash - 1); // 删除尾部反斜杠
    return str;

}


//set转string，用于结果展示
QString set2string(const QSet<int>&s)
{
    QString result;
    for(const auto&i:s)
    {
        result.append(std::to_string(i));
        result+=',';
    }
    if(result.size()!=0)
        result.chop(1);
    return result;
}

//分类连续区间字符和非连续字符
QVector<QVector<QChar>> sortCharSet(const QSet<QChar>& s) {
    QChar l = *s.begin();
    char r = l.unicode() - 1;
    QVector<QVector<QChar>> v(2);
    for (const auto& c : s) {
        if (c.unicode() == r + 1) ++r;
        else {
            if (l == r) v[1].push_back(l);
            else v[0].push_back(l), v[0].push_back(r);
            //l = r = c;
            r=c.unicode();
            l=c;
        }
    }
    if (l == r) v[1].push_back(l);
    else v[0].push_back(l), v[0].push_back(r);
    return v;
}


QString escape(const QChar&c)
{
    switch(c.unicode()){
    case('\n'):return "\\n";
    case('\\'):return "\\\\";
    case('\''):return "\\\'";
    case('\"'):return "\\\"";
    default:return STR(c);
    }
}


